const gulp = require('gulp');
const gulpBrowserSync = require('browser-sync').create(); // 服务器
const gulpClean = require('gulp-clean'); // 清除文件
const sass = require('gulp-sass'); // 编译scss
const concat = require('gulp-concat'); // 合并css
const cleanCss = require('gulp-clean-css'); // css压缩
const autoprefixer = require('gulp-autoprefixer'); // css加前缀
const babel = require("gulp-babel"); // 编译js，兼容当前浏览器
const jshint = require("gulp-jshint");// js检查
const uglify = require('gulp-uglify'); // js压缩
const rename = require('gulp-rename'); // 文件重命名
const ejs = require("gulp-ejs") // ejs 模板引擎
const configData = require('./config'); // 博客配置文件
const { nav } = require('./config/nav.js'); // 博客配置文件

// 热更新
function server() {
  return gulpBrowserSync.init({
    server: {
      baseDir: "./dist"
    },
    port: 8080
  }, function () {
    // 监听
    watch()
  })
}

// 重启服务
function reload() {
  build()
  gulpBrowserSync.reload()
}

// 清除dist文件
function clean(cb) {
  return gulp.src(['dist/*'], { read: false })
    .pipe(gulpClean());
}

// 静态文件 复制到dist/static 排除css，js
function static() {
  let pathArray = ['static/**/*', '!static/css/**', '!static/js/**']
  return gulp.src(pathArray)
    .pipe(gulp.dest('dist/static/'));
}

// lib 复制到dist/lib
function copyLib() {
  let pathArray = ['lib/**/*']
  return gulp.src(pathArray)
    .pipe(gulp.dest('dist/lib/'));
}

// html
function html() {
  let environment = configData.environment
  var extname = environment === 'dev' ? '.html' : '.ejs' // 文件后缀
  var path = environment === 'dev' ? 'dist/' : 'template/' // 文件输出路径
  // 复制到dist
  return gulp.src('pages/**/*.html')
    .pipe(ejs({
      ...configData,
      nav
    }))
    .pipe(rename(function (path) {
      path.basename = path.dirname // 将目录名作为文件名
      path.dirname = '' // 将文件放到一级目录
    }))
    .pipe(gulp.dest(path))
}

// css
function css() {
  // 1、将css、scss 编译成css
  // 2、合并css、添加前缀
  // 3、压缩css
  return gulp.src(['static/css/**/*.css', 'static/css/**/*.scss'])
    .pipe(sass())//编译scss
    .pipe(concat('css/main.min.css'))
    .pipe(autoprefixer({
      overrideBrowserslist: ['last 2 versions'],
      cascade: false
    }))
    .pipe(cleanCss())
    .pipe(gulp.dest('dist/static/'))
}

// copy page css
function copyPageCss() {
  return gulp.src(['pages/**/*.scss', 'pages/**/*.css'])
    .pipe(sass())//编译scss
    .pipe(autoprefixer({
      overrideBrowserslist: ['last 2 versions'],
      cascade: false
    }))
    .pipe(cleanCss())
    .pipe(gulp.dest('dist/static/css'))
}

// copy components css
function copyComponentsCss() {
  return gulp.src(['components/**/*.scss', 'components/**/*.css'])
    .pipe(sass())//编译scss
    .pipe(concat('css/components.min.css'))
    .pipe(autoprefixer({
      overrideBrowserslist: ['last 2 versions'],
      cascade: false
    }))
    .pipe(cleanCss())
    .pipe(gulp.dest('dist/static/'))
}

// js
function js() {
  // 1、合并js，检查js、编译js
  // 2、压缩js
  return gulp.src(['static/js/**/*.js'])
    .pipe(concat('main.min.js')) // 多个js合并成一个
    .pipe(jshint())//检查代码
    .pipe(babel({//编译ES6
      presets: ['es2015']
    }))
    .pipe(uglify())//压缩js
    .pipe(gulp.dest('dist/static/js'))
}

// copy page js
function copyPageJs() {
  return gulp.src(['pages/**/*.js',])
    .pipe(jshint())//检查代码
    .pipe(babel({//编译ES6
      presets: ['es2015']
    }))
    .pipe(uglify())//压缩js
    .pipe(gulp.dest('dist/static/js'))
}

// copy components js
function copyComponentsJs() {
  // 1、合并js，检查js、编译js
  // 2、压缩js
  return gulp.src(['components/**/*.js'])
    .pipe(concat('components.min.js')) // 多个js合并成一个
    .pipe(jshint())//检查代码
    .pipe(babel({//编译ES6
      presets: ['es2015']
    }))
    .pipe(uglify())//压缩js
    .pipe(gulp.dest('dist/static/js'))
}

// 监听
function watch() {
  let pathArray = ['./static/**/*', './pages/**/*', './components/**/*', './config/**/*', './untils/**/*']
  gulp.watch(pathArray, function () {
    gulp.start(reload()); // 防止watch只执行一次
  });
}

// 打包项目
const build = gulp.series(clean, html, css, copyPageCss, copyComponentsCss, js, copyPageJs, copyComponentsJs, static,copyLib);

// 打包项目、启动服务器
const dev = gulp.series(build, server);

// 仅仅启动服务器
const run = gulp.series(server);

exports.dev = dev;
exports.build = build;
exports.run = run;
